# 350. 两个数组的交集
# 给你两个整数数组 nums1 和 nums2 ，请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数，应与元素在两个数组中都出现的次数一致（如果出现次数不一致，则考虑取较小值）。可以不考虑输出结果的顺序。

#  

# 示例 1：

# 输入：nums1 = [1,2,2,1], nums2 = [2,2]
# 输出：[2,2]
# 示例 2:

# 输入：nums1 = [4,9,5], nums2 = [9,4,9,8,4]
# 输出：[4,9]
#  

# 提示：

# 1 <= nums1.length, nums2.length <= 1000
# 0 <= nums1[i], nums2[i] <= 1000
#  

# 进阶：

# 如果给定的数组已经排好序呢？你将如何优化你的算法？
# 如果 nums1 的大小比 nums2 小，哪种方法更优？
# 如果 nums2 的元素存储在磁盘上，内存是有限的，并且你不能一次加载所有的元素到内存中，你该怎么办？


# 来源：力扣（LeetCode）
# 链接：https://leetcode.cn/problems/intersection-of-two-arrays-ii
# 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。


from time import time
from typing import List
from collections import Counter


class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        # 解法1
        ab = [] 
        if len(nums1)<len(nums2):
            a = dict(Counter(nums1))
            for i in nums2:
                if i in a and a[i]>0:
                    a[i] -= 1
                    ab.append(i)
                    
        else:
            b = dict(Counter(nums2))
            for i in nums1:
                if i in b and b[i]>0:
                    b[i] -= 1
                    ab.append(i)
        return ab
        # 解法2
        # ab = []
        # if len(nums1)>len(nums2):
        #     nums1,nums2=nums2,nums1
        # b = dict(Counter(nums2))
        # for i in nums1:
        #     if i in b and b[i]>0:
        #         b[i] -= 1
        #         ab.append(i)
        # return ab
        
        # 解法3
        # nums1.sort()
        # nums2.sort()
        # a, b = 0, 0
        # ab = []
        # while a<len(nums1) and b< len(nums2):
        #     if nums1[a] == nums2[b]:
        #         ab.append(nums1[a])
        #         a +=1
        #         b +=1
        #     elif nums1[a] > nums2[b]:
        #         b +=1
        #     else:
        #         a +=1
        # return ab
                
    
if __name__ == '__main__':
    start = time()
    a = Solution()
    print(a.intersect(nums1 = [3,1,2], nums2 = [1,1]))
    end = time()
    print('='*40)
    print("start time is ", start*1000)
    print("end   time is ", end*1000)
    print("耗时:",end*1000 - start*1000,"ms")